package com.manage.server.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.manage.dto.UserDTO;
import com.manage.dto.add.UserAddDTO;
import com.manage.dto.update.UserUpdateDTO;
import com.manage.entity.User;
import com.manage.result.PageResult;
import com.manage.server.mapper.UserMapper;
import com.manage.server.service.UserService;
import com.manage.vo.UserVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

/**
 * @description 针对表【user(用户表)】的数据库操作Service实现
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public boolean save(UserAddDTO userAddDTO) {
        User user = new User();
        BeanUtils.copyProperties(userAddDTO, user);
        // 严格保持默认值设置逻辑
        if(user.getIsActive() == null) {
            user.setIsActive(1); // 默认启用状态
        }
        return this.save(user);
    }

    @Override
    public boolean updateById(UserUpdateDTO userUpdateDTO) {
        User user = new User();
        BeanUtils.copyProperties(userUpdateDTO, user);
        return super.updateById(user);
    }

    @Override
    public PageResult<UserVO> findUserByPage(UserDTO dto) {
        // 1. 处理分页参数（严格保持默认值设置）
        int pageNum = dto.getPageNum() != null && dto.getPageNum() > 0 ? dto.getPageNum() : 1;
        int pageSize = dto.getPageSize() != null && dto.getPageSize() > 0 ? dto.getPageSize() : 10;

        // 2. 创建分页对象（严格保持参数顺序）
        Page<User> page = new Page<>(pageNum, pageSize);

        // 3. 构建动态查询条件（严格保持条件构建顺序）
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();

        // 字符串模糊查询（严格保持trim处理）
        if (StringUtils.hasText(dto.getUsername())) {
            queryWrapper.like("username", dto.getUsername().trim());
        }
        if (StringUtils.hasText(dto.getRealName())) {
            queryWrapper.like("real_name", dto.getRealName().trim());
        }
        if (StringUtils.hasText(dto.getPhone())) {
            queryWrapper.like("phone", dto.getPhone().trim());
        }
        if (StringUtils.hasText(dto.getEmail())) {
            queryWrapper.like("email", dto.getEmail().trim());
        }

        // 精确匹配条件（严格保持null检查）
        if (dto.getId() != null) {
            queryWrapper.eq("id", dto.getId());
        }
        if (dto.getIsActive() != null) {
            queryWrapper.eq("is_active", dto.getIsActive());
        }
        if (dto.getGender() != null) {
            queryWrapper.eq("gender", dto.getGender());
        }

        // 日期范围查询（严格保持条件判断）
        if (dto.getBirthdate() != null) {
            queryWrapper.ge("birthdate", dto.getBirthdate());
        }

        // 4. 执行分页查询（严格保持方法调用）
        Page<User> resultPage = this.page(page, queryWrapper);

        // 5. 转换Entity到VO（严格保持安全处理）
        Page<UserVO> voPage = (Page<UserVO>) resultPage.convert(entity -> {
            UserVO vo = new UserVO();
            BeanUtils.copyProperties(entity, vo);
            // 严格保持敏感字段处理
//            vo.setPassword(null);
            return vo;
        });

        // 6. 返回分页结果（严格保持包装格式）
        return PageResult.success(voPage);
    }

    @Override
    public User login(String username) {
        User user=userMapper.selectOne(new QueryWrapper<User>().eq("username", username));
        return user;
    }

    @Override
    public void updateUserAvatar(Integer userId, String filename) {
        // 直接构建更新对象，避免先查询
        User updateUser = new User();
        updateUser.setId(userId);
        updateUser.setAvatar(filename);

        int result = userMapper.updateById(updateUser);
        if (result <= 0) {
            throw new RuntimeException("更新用户头像失败，用户ID: " + userId);
        }
    }
}